package club.xyes.zkh.ecommerce.wechat.service;

import club.xyes.zkh.ecommerce.wechat.dto.*;

import java.io.IOException;
import java.util.Map;

/**
 * Create by 郭文梁 2019/4/17 0017 14:51
 * WeChatService
 * 微信相关API服务
 *
 * @author 郭文梁
 * @data 2019/4/17 0017
 */
public interface WeChatService {
    /**
     * code 换openid
     *
     * @param appId  appId
     * @param secret secret
     * @param code   临时code
     * @return Code2SessionResult
     */
    Code2SessionResult code2Session(String appId, String secret, String code);

    /**
     * 解密数据为用户信息
     *
     * @param sessionKey sessionKey
     * @param iv         初始向量
     * @param data       加密数据
     * @return 解密结果
     */
    WxUserInfoResult toUserInfo(String sessionKey, String iv, String data);

    /**
     * 获取AccessToken
     *
     * @param appId  AppId
     * @param secret Secret
     * @return AccessToken
     * @throws IOException IO异常
     */
    WxAccessToken getAccessToken(String appId, String secret) throws IOException;

    /**
     * 发送微信模板消息
     *
     * @param appId        AppId
     * @param templateId   模板ID
     * @param token        令牌信息
     * @param toUserOpenId 发送到的用户的OpenId
     * @param data         模板数据
     * @param options      附加信息 可选
     * @param miniProgram  小程序相关参数
     * @param formId       FormId
     * @return Result（errcode等）
     * @throws IOException IO异常
     */
    SendTemplateMsgResult sendTemplateMsg(String appId,
                                          WxAccessToken token,
                                          String formId,
                                          String templateId,
                                          String toUserOpenId,
                                          Map<String, TemplateMsgData> data,
                                          Map<String, String> miniProgram,
                                          Map<String, Object> options) throws IOException;

    /**
     * 同意服务消息发送
     *
     * @param appId        AppId
     * @param token        Token
     * @param toUserOpenId OpenId
     * @param templateId   模板ID
     * @param url          跳转链接
     * @param data         模板数据
     * @param mpAppId      小程序AppId
     * @return 发送结果
     * @throws IOException IO异常
     */
    UniformMessageSendResult sendUniformMessage(String appId,
                                                String mpAppId,
                                                WxAccessToken token,
                                                String toUserOpenId,
                                                String templateId,
                                                String url,
                                                Map<String, TemplateMsgData> data) throws IOException;

    /**
     * 获取微信网页授权的AccessToken和OpenId
     *
     * @param appId  AppId
     * @param secret Secret
     * @param code   code 由前端网页提供
     * @return 返回信息
     * @throws IOException IO异常
     */
    WxOauth2AccessTokenResult oauth2CodeToken(String appId, String secret, String code) throws IOException;
}
